#include "huffman.h"
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>


void armarArbol(int contexto) {
	int j,k;
	int primer_menor,segundo_menor;
	for (j=257;j<513;j++) {
		arboles[contexto][j].frecuencia=LLONG_MAX;
		primer_menor=j;
		for (k=0;k<j;k++){
			if (arboles[contexto][k].frecuencia<arboles[contexto][primer_menor].frecuencia && arboles[contexto][k].padre==NO_PADRE) primer_menor=k;
		}
		segundo_menor=j;
		for (k=0;k<j;k++){
			if (arboles[contexto][k].frecuencia<arboles[contexto][segundo_menor].frecuencia && arboles[contexto][k].padre==NO_PADRE && k!=primer_menor) segundo_menor=k;
		}
		arboles[contexto][j].padre=NO_PADRE;
		arboles[contexto][j].izquierda=primer_menor;
		arboles[contexto][j].derecha=segundo_menor;
		arboles[contexto][j].frecuencia=arboles[contexto][primer_menor].frecuencia+arboles[contexto][segundo_menor].frecuencia;
		arboles[contexto][primer_menor].padre=j;
		arboles[contexto][segundo_menor].padre=j;
	}
}

void armarArboles(){
	int i;
	for (i=0;i<CANT_ARBOLES;i++) {
		armarArbol(i);
	}
}

void rearmarArbol(int contexto){
	int i;
	for (i=0;i<257;i++) {
		arboles[contexto][i].padre=NO_PADRE;
	}
	armarArbol(contexto);
}

void resetHuffman() {
	int i,j;
	for (i=0;i<CANT_ARBOLES;i++) {
		for (j=0;j<257;j++) {
			arboles[i][j].padre=NO_PADRE;
			arboles[i][j].izquierda=NO_HIJO;
			arboles[i][j].derecha=NO_HIJO;
			arboles[i][j].frecuencia=1;
		}
	}
	armarArboles(arboles);
}

void emitirCero() {
	extern int longComprimido;
	longComprimido++;
//	printf("0");
}

void emitirUno() {
	extern int longComprimido;
	longComprimido++;
//	printf("1");
}

void emitirBinario(int contexto,int codigo) {
	if (codigo!=NODO_RAIZ) {
		emitirBinario(contexto,arboles[contexto][codigo].padre);
		if (arboles[contexto][ arboles[contexto][codigo].padre ].izquierda==codigo)
			emitirCero();
		else
			emitirUno();
	}
}

void emitirHuffman(int contexto,int codigo) {
	emitirBinario(contexto,codigo);
	arboles[contexto][codigo].frecuencia+=256;
	rearmar[contexto]++;
	if (rearmar[contexto]==8) {
		rearmarArbol(contexto);
		rearmar[contexto]=0;
	}
}

